module test #(parameter     TIME_1S = 25_000_000)(
    input               clk     ,
    input               rst_n   ,
    input               key     ,
    input               en      ,
    input               uart_en ,//表示当前是否正在输出温度到串口，避免发生冲突，当uart_en = 0的时候，才可以发送其他串口数据的有效信号
    output   reg [3:0]  led     ,
    output              led_en  ,
    output   reg [7:0]  led_data//表示输出的数据
);

    reg         [1:0]      led_com  ;
    reg         [3:0]      MF       ;   //要传输出去的数据的最大值
    reg         [3:0]       usart_cnt     ;
    wire                    add_usart_cnt ;
    wire                    end_usart_cnt ;

    reg     [1:0]       flag    ;//保留按钮

     reg    [26:0]  cnt;
     wire            add_cnt;   //计数器什么时候有效
     wire            end_cnt;   
     always @(posedge clk or negedge rst_n) begin
         if (!rst_n) begin
             cnt<=27'b0;
         end
         else if(add_cnt)begin
             if(end_cnt)begin
                 cnt<=27'b0;
             end
             else begin
                 cnt<=cnt+1'b1;
             end
         end
         else begin
             cnt<=cnt;
         end
     end
     assign add_cnt=1'b1;
     assign end_cnt=add_cnt&&cnt==TIME_1S-1;  //组合逻辑

    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            led <= 4'b0001;
            led_com <= 2'b0;
        end 
        else if(key &&~en)begin //开门 door\r\n  6
            led <= 4'b1111;
            led_com <= 2'b01;
        end 
        else if (en &&end_cnt) begin//排风扇开启 fan\r\n  5
            led <= {led[2:0],led[3]};
            led_com <= 2'b10;
        end
        else if (en &&key)begin//开门同时开排风扇 door and fan\r\n  14
            led <=4'b1100;
            led_com <= 2'b11;
        end
        else begin 
            led <= led ;
            led_com <= 0;
        end 
    end

    //保留一个时钟的按键信号
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            flag <= 0;
        end 
        else if(led_com == 2'b01)begin 
            flag <= 2'b01;
        end 
        else if(led_com == 2'b10)begin
            flag <= 2'b10;
        end
        else if(led_com == 2'b11)begin 
            flag <= 2'b11;
        end
        else begin
            flag <= flag;
        end
    end


    //连续发送12个字符的间隔设定为200us
    parameter   TIME_200uS = 1_000_0;
    reg         [13:0]      cnt_200uS;
    wire                    add_cnt_200uS;
    wire                    end_cnt_200uS;
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            cnt_200uS <= 0;
        end 
        else if(add_cnt_200uS)begin 
            if(end_cnt_200uS)begin 
                cnt_200uS <= 0;
            end
            else begin 
                cnt_200uS <= cnt_200uS + 1;
            end 
        end
        else begin
            cnt_200uS <= cnt_200uS;
        end
    end 
    assign add_cnt_200uS = 1'b1;
    assign end_cnt_200uS = add_cnt_200uS && cnt_200uS ==  TIME_200uS - 1;

    always @(*)begin
        case(flag)
            2'b01   :   MF = 6;
            2'b10   :   MF = 5;
            2'b11   :   MF = 14;
            default :   MF = 0;
        endcase
    end

    assign led_en = add_usart_cnt;
    //计数当前发了多少个数据计数器
    always @(posedge clk or negedge rst_n)begin 
        if(!rst_n)begin
            usart_cnt <= 0;
        end 
        else if(add_usart_cnt)begin 
            if(end_usart_cnt)begin 
                usart_cnt <= 0;
            end
            else begin 
                usart_cnt <= usart_cnt + 1;
            end 
        end
        else begin
            usart_cnt <= 0;
        end
    end 
    assign add_usart_cnt = !flag && end_cnt_200uS && !en;//当有操作开始的时候200us间隔结束，当前串口未被占用温度的时候
    assign end_usart_cnt = add_usart_cnt && usart_cnt ==  MF - 1;

    //定义输出数据
    always @(*)begin
        if(flag == 2'b01)begin
            //发送开门命令
            case(usart_cnt)
                1       :   led_data = 8'b01100100;//d
                2       :   led_data = 8'b01101111;//o
                3       :   led_data = 8'b01101111;//o
                4       :   led_data = 8'b01110010;//r
                5       :   led_data = 8'b00001101;//\r
                6       :   led_data = 8'b00001010;//\n
                default :   led_data = 8'b0;
            endcase
        end
        else if (flag == 2'b10)begin
            case(usart_cnt)
                1       :   led_data = 8'b01100110;//f
                2       :   led_data = 8'b01100001;//a
                3       :   led_data = 8'b01101110;//n
                4       :   led_data = 8'b00001101;//\r
                5       :   led_data = 8'b00001010;//\n
                default :   led_data = 8'b0;
            endcase
        end
        else if (flag == 2'b11)begin
            case(usart_cnt)
                1       :   led_data = 8'b01100100;//d
                2       :   led_data = 8'b01101111;//o
                3       :   led_data = 8'b01101111;//o
                4       :   led_data = 8'b01110010;//r
                5       :   led_data = 8'b00100000;//空格
                6       :   led_data = 8'b01100001;//a
                7       :   led_data = 8'b01101110;//n
                8       :   led_data = 8'b01100100;//d
                9       :   led_data = 8'b00100000;//空格
                10      :   led_data = 8'b01100110;//f
                11      :   led_data = 8'b01100001;//a
                12      :   led_data = 8'b01101110;//n
                13      :   led_data = 8'b00001101;//\r
                14      :   led_data = 8'b00001010;//\n
                default :   led_data = 8'b0;
            endcase
        end
    end




endmodule